/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package baseDatos;

import entidades.Bateria;
import entidades.Jaula;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Facundo
 */
public class BateriaDAO {

    private String query;
    private Connection conDB;
    private PreparedStatement pst;

    public BateriaDAO(Connection con) {
        this.conDB = con;
    }

    public BateriaDAO() {
    }

    /**
     * @return the query
     */
    public String getQuery() {
        return query;
    }

    /**
     * @param query the query to set
     */
    public void setQuery(String query) {
        this.query = query;
    }

    /**
     * @return the conDB
     */
    public Connection getConDB() {
        return conDB;
    }

    /**
     * @param conDB the conDB to set
     */
    public void setConDB(Connection conDB) {
        this.conDB = conDB;
    }

    /**
     * @return the pst
     */
    public PreparedStatement getPst() {
        return pst;
    }

    /**
     * @param pst the pst to set
     */
    public void setPst(PreparedStatement pst) {
        this.pst = pst;
    }


    /*
     * Metodo que devuelve un solo objeto Bateria de acuerdo a la camara que pertence y su nombre
     */
    public Bateria getBateria(int codigoCamara, String nombre) {
        Bateria bat = null;
        setQuery("select * from PC_BATERIA where codigo_camara =" + codigoCamara + " and nobre='" + nombre + "'");
        bat = this.devolverBateria(getQuery());
        return bat;
    }

    /*
     * Metodo que devuelve una beteria determinada de acuerdo al codigo de bateria recibida
     */
    public Bateria getBateria(int codigo) {
        Bateria bat = null;
        setQuery("select * from PC_BATERIA where codigo_bateria=" + codigo);
        bat = this.devolverBateria(getQuery());
        return bat;
    }

    /*
     * Metodo que devuelve una determinada bateria de acuerdo a la sentencia recibida por parametro
     */
    private Bateria devolverBateria(String sentencia) {
        Bateria bat = null;
        ResultSet rs;
        setQuery(sentencia);
        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                bat = new Bateria();
                bat.setNombre(rs.getString("nombre"));
                if (rs.getString("descripcion") != null) {
                    bat.setDescripcion(rs.getString("descripcion"));
                }
                bat.setJaula(new JaulaDAO(this.getConDB()).getJaulas(rs.getInt("codigo_bateria")));
            }
            rs.close();
            getPst().close();
        } catch (SQLException ex) {
            Logger.getLogger(BateriaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return bat;
    }

    /*
     * Metodo que devuelve un arrayList de baterias de acuerdo al codigo de camara pasado por parametro
     */
    public ArrayList getBaterias(int codigoCamara) {
        ArrayList baterias = null;
        setQuery("select * from PC_BATERIA where codigo_camara=" + codigoCamara);
        baterias = this.devolverBaterias(getQuery());
        return baterias;
    }

    /*
     * Metodo que devuelve un arrayList de baterias
     */
    public ArrayList getBaterias() {
        ArrayList baterias = null;
        setQuery("select * from PC_BATERIA");
        baterias = this.devolverBaterias(getQuery());
        return baterias;
    }

    /*
     * Metodo que devuelve un array de baterias con sus respectivas camaras de acuerdo a
     * la sentencia que viene por parametro
     */
    private ArrayList devolverBaterias(String sentencia) {
        ArrayList todos = null;
        Bateria bat = null;
        ResultSet rs;
        setQuery(sentencia);

        try {
            todos = new ArrayList();
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                bat = new Bateria();
                bat.setNombre(rs.getString("nombre"));
                if (rs.getString("descripcion") != null) {
                    bat.setDescripcion(rs.getString("descripcion"));
                }
                bat.setJaula(new JaulaDAO(this.getConDB()).getJaulas(rs.getInt("codigo_bateria")));
                todos.add(bat);
            }
            rs.close();
            getPst().close();
        } catch (SQLException ex) {
            Logger.getLogger(BateriaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return todos;
    }
    /*
     * este metodo devuelve un array con todas las baterias pertenecientes a una determinada camara.
     * Recibe por parametro el codigo de la camara y el codigo del estado de las jaulas y devuelve un
     * array con baterias.
     */

    public ArrayList allCamaraBateriaJaula(int codigoCamara, int estadoJaula) {
        try {
            ArrayList todos = null;
            Bateria bat = null;
            ResultSet rs;
            setQuery("SELECT * FROM PC_BATERIA where codigo_camara =" + codigoCamara);
            System.out.println("Sentencia que devuelve las baterias segun el tipo de camara: "+this.getQuery());
            todos = new ArrayList();
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                bat = new Bateria();
                bat.setNombre(rs.getString("nombre"));
                if (rs.getString("descripcion") != null) {
                    bat.setDescripcion(rs.getString("descripcion"));
                }
                bat.setJaula(new JaulaDAO(this.getConDB()).getJaulaBateriaEstado(estadoJaula, rs.getInt("codigo_bateria")));
                todos.add(bat);
            }
            rs.close();
            getPst().close();
            return todos;
        } catch (SQLException ex) {
            Logger.getLogger(BateriaDAO.class.getName()).log(Level.SEVERE, null, ex);
            System.out.println("Excepcion en allCamaraBateriaJaula: " + ex.getMessage());
        }
        return null;
    }

    /*
     * metodo para devolver el codigo de una bateria, recibe x parametro el nombre de la bateria y
     * el codigo de la camara
     */
    public int devolverCodigoBateria(String nombre, int codigoCamara) {
        int codigoBateria = -1;
        ResultSet rs;
        setQuery("select codigo_bateria from PC_BATERIA where nombre='" + nombre + "' and codigo_camara=" + codigoCamara);

        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                codigoBateria = rs.getInt("codigo_bateria");
            }
            rs.close();
            getPst().close();
        } catch (SQLException ex) {
            Logger.getLogger(BateriaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return codigoBateria;
    }

    /*
     * metodo para devolver el codigo de una camara a la cual pertenece una bateria,
     * recibe x parametro el codigo de la bateria
     */
    public int devolverCodigoCamara(int codigoBateria) {
        int codigoCamara = -1;
        ResultSet rs;
        setQuery("select codigo_camara from PC_BATERIA where codigo_bateria=" + codigoBateria);

        try {
            setPst(getConDB().prepareStatement(getQuery()));
            rs = getPst().executeQuery();
            while (rs.next()) {
                codigoCamara = rs.getInt("codigo_camara");
                return codigoCamara;
            }
            rs.close();
            getPst().close();
        } catch (SQLException ex) {
            Logger.getLogger(AnimalDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return codigoCamara;
    }

    public int getCodBateria(Jaula jau) {
        try {
            String sql = "SELECT codigo_bateria FROM pc_jaula WHERE nombre = '" + jau.getNombre() + "'";
            System.out.println("Sentencia que devuelvue el codigo de bateria segun el nombre de la jaula");
            this.setPst(this.getConDB().prepareStatement(sql));
            ResultSet rs = this.getPst().executeQuery();
            int codBateria=0;
            while (rs.next()) {
                codBateria=rs.getInt("codigo_bateria");
            }
            rs.close();
            this.getPst().close();
            return codBateria;
        } catch (SQLException ex) {
            Logger.getLogger(BateriaDAO.class.getName()).log(Level.SEVERE, null, ex);
        }
        return -1;
    }
}

